﻿using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Jn698._45Tool.Windows
{
    public partial class MeterFlowerModeBit : Form
    {
        public MeterFlowerModeBit(string title)
        {
            InitializeComponent();
            this.Text = title;
            // BitConverter.ToChar();
            Int32 data = 0x50000000;
            var byteData = BitConverter.GetBytes(data);
            Array.Reverse(byteData);
            List<bool> value = new List<bool>();
            foreach (var item in byteData)
            {
               value.AddRange(GetBitBool(item));
            }
            
            var d = BitConverter.ToInt32(GetByteArrary(value), 0);
            Console.WriteLine(d);
        }

        /// <summary>
        /// 反转顺序并生成字节
        /// </summary>
        /// <param name="data">位数据</param>
        /// <returns></returns>
        private static byte GetBitArray(IEnumerable<bool> data)
        {
            //把位数据集合反转
            //data=data.Reverse();

            //定义初始字节，值为0000 0000
            byte temp = 0x00;

            //循环计数
            int index = 0;

            //循环位集合
            foreach (bool item in data)
            {
                //判断每一位的数据，为true则左移一个1到对应的位置
                if (item) temp = (byte)(temp | (0x01 << index));

                //计数+1
                index++;
            }

            //返回最后使用位数据集合生成的二进制字节
            return temp;
        }
        /// <summary>
        /// 获取1个字节的8位二进制
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        private static List<bool> GetBitBool(byte data)
        {
            List<bool> bools = new List<bool>();
            
            for (int i = 0; i < 8; i++)
            {
                var bit = (data >> i) & 0x01;
                bools.Add(bit == 1 ? true : false);
                
            }
            return  bools;
        }

        private static byte[] GetByteArrary(List<bool> value)
        {
            
            List<byte> valueTemp = new List<byte>();
            //由于一个字节只有八个位，所以如果需要写入的值超过了八个，
            //则需要生成一个新的字节用以存储，
            //所以循环截取输入的值，然后生成对应的写入值字节
            for (int i = 0; i < value.Count(); i += 8)
            {
                //写入值字节临时字节集合
                List<bool> temp = value.Skip(i).Take(8).ToList();

                //剩余位不足八个，则把剩下的所有位都放到同一个字节里
                if (temp.Count != 8)
                {
                    //取余获取剩余的位的数量
                    int m = value.Count() % 8;
                    //截取位放入临时字节集合中
                    temp = value.Skip(i).Take(m).ToList();
                }

                //获取位生成的写入值字节
                byte tempByte = GetBitArray(temp);

                //将生成的写入值字节拼接到写入值字节集合中
                valueTemp.Add(tempByte);
            }
            byte[] bytes = valueTemp.ToArray();
            Array.Reverse(bytes);
            return bytes;
        }
    }
}
